package gomz.pres.admin;

import gomz.pres.ListCheckedListener;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.GregorianCalendar;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileNameExtensionFilter;

/**
 * Diese Klasse steuert das UI des Exports
 * 
 * @author Dilji
 */

public class CAExport {

	// ********************************************************************************
	// Variabeln
	// ********************************************************************************
	private MVerwaltung model;
	private GUIAExport view;
	private JFrame pWindow;

	// *********************************************************************************
	// Konstruktor
	// ********************************************************************************
	/**
	 * Konstruktor fuer den Controller fuer den Export
	 */
	public CAExport(JFrame pWindow, GUIAExport view, MVerwaltung model) {
		this.model = model;
		this.view = view;
		this.pWindow = pWindow;

		addListener();
	}

	// ********************************************************************************
	// Listener
	// ********************************************************************************
	/**
	 * Ereignisbehandlung fuer die Buttons
	 */
	private void addListener() {
		// Kategorieauswahl
		view.getLiJcat().addListCheckedListener(new ListCheckedListener() {
			public void checkedPerformed() {
				doCategoryChange();
			}
		});

		// Export
		view.getBtJexport().addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				doExport();
			}

		});

		// Cancel
		view.getBtJcan().addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				doCancel();
			}

		});

	}

	// ********************************************************************************
	// Methoden
	// ********************************************************************************
	/**
	 * Diese Methode fuer die Aenderungen bei den Kategorien durch
	 */
	private void doCategoryChange() {
		int[] si = view.getLiJcat().getCheckedIndeces();
		model.filterQuestionToUse(si);
		view.getLiJque().setListData(model.getQuestionList());
	}

	/**
	 * Diese Methode ueberprueft ob mindestens eine Frage und die Art fuer den Export ausgewaehlt wurden,
	 * falls dies so ist ruft sie die Methode doSaveExport auf
	 */
	public void doExport() {

		// Ob Frage ausgewaehlt
		Boolean liSel = false;

		// Wenn etwas ausgewaehlt, dann true
		int[] i = view.getLiJque().getCheckedIndeces();
		for (int j : i) {
			liSel = true;
		}

		if (liSel) {
			// wenn min. 1 Frage ausgewaehlt weiter
			if ((view.getRbJone().isSelected()) || (view.getRbJall().isSelected())) {
				// wenn Art ausgewaehlt ist weiter
				doSaveExport();
			} else {
				JOptionPane.showMessageDialog(pWindow, "Bitte w\u00e4hlen Sie eine Art f\u00fcr den Export aus ('" + view.getRbJone().getText() + "' oder '" + view.getRbJall().getText() + "').", "Art ausw\u00e4hlen", JOptionPane.WARNING_MESSAGE);
			}
		} else {
			JOptionPane.showMessageDialog(pWindow, "Bitte w\u00e4hlen Sie mindestens eine Frage f\u00fcr den Export aus.", "Frage ausw\u00e4hlen", JOptionPane.WARNING_MESSAGE);
		}
	}

	/**
	 * Diese Methode oeffnet das Dialog-Fenster damit der Benutzer einen Pfad fuer den Export auswaehlen kann, 
	 * schlaegt ihm einen Dateinamen vor und oeffnet die enstsprechende Model-Methode
	 */
	private void doSaveExport() {

		// initialize path for export
		File exportPath = null;

		// initialize FileChooser
		final JFileChooser fc = new JFileChooser();

		// heutiges Datum
		GregorianCalendar now = new GregorianCalendar();
		SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy");

		// Name vorschlagen
		final File sFile = new File("export-" + df.format(now.getTime()) + ".doc");

		// vorgeschlagenen Namen im Dialog anzeigen
		fc.setSelectedFile(sFile);

		// Titel des Export-Fensters setzten
		fc.setDialogTitle("Export");

		// initialize filter fur doc
		final FileNameExtensionFilter wordFilter = new FileNameExtensionFilter("Word-Dokument (*.doc)", "doc");
		// initialize filter fur csv
		final FileNameExtensionFilter excelFilter = new FileNameExtensionFilter("Excel-Dokument (*.csv)", "csv");
		// add filter word
		fc.addChoosableFileFilter(wordFilter);
		// add filter excel
		fc.addChoosableFileFilter(excelFilter);

		// "Alle Dateien" Option ausblenden
		fc.setAcceptAllFileFilterUsed(false);

		// Standardmaessig word-Filter setzten
		fc.setFileFilter(wordFilter);

		// Pruefen ob CSV ausgewaehlt, wenn ja Filter + Dateiendung setzten
		if (view.getRbJcsv().isSelected()) {
			fc.setFileFilter(excelFilter);
			String temp = sFile.getName();
			temp = temp.substring(0, temp.lastIndexOf("."));
			fc.setSelectedFile(new File(temp + ".csv"));
		}

		// bei Aenderungen im SaveDialog Dateiendung anpassen
		fc.addPropertyChangeListener(JFileChooser.FILE_FILTER_CHANGED_PROPERTY, new PropertyChangeListener() {
			public void propertyChange(PropertyChangeEvent evt) {
				Object o = evt.getNewValue();
				if (o instanceof FileNameExtensionFilter) {
					FileNameExtensionFilter filter = (FileNameExtensionFilter) o;

					String ex = filter.getExtensions()[0];

					File selectedFile = fc.getSelectedFile();
					if (selectedFile == null) {
						selectedFile = sFile;
					}
					String path = selectedFile.getName();
					path = path.substring(0, path.lastIndexOf("."));

					fc.setSelectedFile(new File(path + "." + ex));
				}
			}
		});

		// SaveDialog oeffnen
		int temp = fc.showSaveDialog(fc);
		if (temp == JFileChooser.APPROVE_OPTION) {
			// endgueltigen Pfad in variable speichern
			exportPath = fc.getSelectedFile();
		}

		// pruefen ob pfad mitgeben wurde
		if (exportPath != null) {

			// pruefen ob doc datei, falls ja exportQuestionToDoc starten
			if (fc.getSelectedFile().getName().endsWith(".doc")) {
				if (model.exportQuestionToDoc(exportPath, view.getLiJque().getCheckedIndeces(), view.getRbJall().isSelected())) {
					JOptionPane.showMessageDialog(pWindow, "Die Datei wurde gespeichert.", "Export erfolgreich", JOptionPane.INFORMATION_MESSAGE);
				}

			// pruefen ob csv datei, falls ja exportQuestionToCsv starten
			} else if (fc.getSelectedFile().getName().endsWith(".csv")) {
				if (model.exportQuestionToCsv(exportPath, view.getLiJque().getCheckedIndeces(), view.getRbJall().isSelected())) {
					JOptionPane.showMessageDialog(pWindow, "Die Datei wurde gespeichert.", "Export erfolgreich", JOptionPane.INFORMATION_MESSAGE);
				} else {
					JOptionPane.showMessageDialog(pWindow, "Die Datei konnte nicht gespeichert werden.", "Fehler beim Export", JOptionPane.ERROR_MESSAGE);
				}
			
			// sonst Fehlermeldung ausgeben
			} else {
				JOptionPane.showMessageDialog(pWindow, "Die Datei konnte nicht gespeichert werden, es ist ein Fehler mit der Dateiendung aufgetreten.", "Dateiendung", JOptionPane.ERROR_MESSAGE);
			}
		}
	}

	/**
	 * Diese Methode stellt alle Aenderungen in der Export-Ansicht zurueck
	 */
	public void doCancel() {
		// Standardwerte setzten
		view.getRbJone().setSelected(true);
		view.getRbJword().setSelected(true);
		view.getLiJcat().clearSelection();
		view.getLiJque().clearSelection();
		view.getLiJcat().uncheckAll();
		view.getLiJque().uncheckAll();
		fillData();
	}
	
	/**
	 * Diese Methode fuellt die Kategorie- und Fragenliste
	 */
	public void fillData() {
		view.getLiJcat().setListData(model.getCategoryList());
		view.getLiJque().setListData(model.getQuestionList());

		int[] si = view.getLiJcat().getCheckedIndeces();
		model.filterQuestionToUse(si);
		view.getLiJque().setListData(model.getQuestionList());
	}

}
